/*******************************************************************************
  * 文件：TM1620.C
  * 作者：djy
  * 版本：v1.0.0
  * 日期：2020.05.29
  * 说明：TM1620驱动程序
*******************************************************************************/
#include "TM1620.h"

static TM1629Bright_te eBright = eBRIGHT_LEVEL_7; // 默认最亮
/*******************************************************************************
  * 函数名  ：TM1629_SetBright
  * 功  能  ：TM1629设置亮度等级
  * 参  数  ：无
  * 返回值  ：无
  * 说  明  ：无
*******************************************************************************/
void TM1629_SetBright(TM1629Bright_te eTM1629Bright)
{
    if(eTM1629Bright > eBRIGHT_LEVEL_7)
    {
        eTM1629Bright = eBRIGHT_LEVEL_7;
    }

    eBright = eTM1629Bright;
}

/*******************************************************************************
  * 函数名  ：TM1629_WriteByte
  * 功  能  ：TM1629写字节数据
  * 参  数  ：U8 u8Byte：写入的字节
  * 返回值  ：无
  * 说  明  ：总延时大约27us
*******************************************************************************/
static void TM1629_SendByte(U8 u8Byte)
{
    U8 u8Index;

    // 拉低片选，选中芯片
    TM1629_IO_STB_L;
    // 延时
    TM1629_DELAY_US(1);
    
    // LSB-MSB输出u8Byte
    for(u8Index=0;u8Index<8;u8Index++)
    {
        // 拉低CLK
        TM1629_IO_CLK_L;
        // 延时
        TM1629_DELAY_US(1);
        // 输出数据bit
        if(u8Byte&0x01)
        {
            TM1629_IO_DIO_H;
        }
        else
        {
            TM1629_IO_DIO_L;
        }
        // 延时
        TM1629_DELAY_US(1);
        // 置高CLK
        TM1629_IO_CLK_H;
        // 延时
        TM1629_DELAY_US(1);
        // 右移u8Byte
        u8Byte >>= 1;
    }
    // 延时
    TM1629_DELAY_US(1);
}

/*******************************************************************************
  * 函数名  ：TM1629_WriteDisplayBytes
  * 功  能  ：TM1629写入连续数据
  * 参  数  ：U8 u8RegAddr：寄存器地址
            U8 *pu8DataAddr：待写入数据起始地址
            U8 u8Len：待写入数据长度
  * 返回值  ：无
  * 说  明  ：寄存器地址：00-0FH，数据长度最大16字节
*******************************************************************************/
void TM1629_WriteDisplayBytes(U8 u8RegAddr,U8 *pu8DataAddr,U8 u8Len)
{
    // 连续写入最多写入12Byte，寄存器地址范围0-11
    if(u8Len > 12 || u8RegAddr > 11)
    {
        return;
    }
    
    // 设置显示模式，6位8段
    TM1629_SendByte(0x02);
    
    // 片选置高
    TM1629_IO_STB_H;
    
    // 延时
    TM1629_DELAY_US(1);
    
    // 地址自增加模式，写入显示寄存器模式
    TM1629_SendByte(0x40);
    
    // 片选置高
    TM1629_IO_STB_H;
    
    // 1us延时
    TM1629_DELAY_US(1);
    
    // 寄存器起始地址
    TM1629_SendByte(0xC0 | u8RegAddr);
    
    // 将数据连续写入
    for(U8 u8Index=0;u8Index<u8Len;u8Index++)
    {
        TM1629_SendByte(*(pu8DataAddr+u8Index));
    }
    
    // 片选置高
    TM1629_IO_STB_H;
    
    // 延时
    TM1629_DELAY_US(1);
    
    // 开启显示，设置显示亮度
    TM1629_SendByte(0x88 | eBright);
    
    // 片选置高
    TM1629_IO_STB_H;
    
    // 延时
    TM1629_DELAY_US(1);
}

/*******************************************************************************
  * 函数名  ：TM1629_WriteDisplayByte
  * 功  能  ：TM1629写入单个显示寄存器数据
  * 参  数  ：U8 u8RegAddr：寄存器地址
            U8 u8Data：写入数据
  * 返回值  ：无
  * 说  明  ：寄存器地址：00-0FH，总延时大约139us
*******************************************************************************/
void TM1629_WriteDisplayByte(U8 u8RegAddr,U8 u8Data)
{
    // 寄存器地址非法
    if(u8RegAddr > 11)
    {
        return;
    }
    
    // 设置显示模式，6位8段
    TM1629_SendByte(0x02);
    
    // 片选置高
    TM1629_IO_STB_H;
    
    // 延时
    TM1629_DELAY_US(1);
    
    // 固定地址，写入显示寄存器
    TM1629_SendByte(0x44);
    
    // 片选置高
    TM1629_IO_STB_H;
    
    // 延时
    TM1629_DELAY_US(1);
    
    // 寄存器地址
    TM1629_SendByte(0xC0 | u8RegAddr);
    
    // 写入数据
    TM1629_SendByte(u8Data);
    
    // 片选置高
    TM1629_IO_STB_H;
    
    // 延时
    TM1629_DELAY_US(1);
    
    // 开启显示，设置显示亮度
    TM1629_SendByte(0x88 | eBright);
    
    // 片选置高
    TM1629_IO_STB_H;  
    
    // 延时
    TM1629_DELAY_US(1);
}

/*******************************************************************************
  * 函数名  ：TM1629_Init
  * 功  能  ：TM1629初始化
  * 参  数  ：无
  * 返回值  ：无
  * 说  明  ：无
*******************************************************************************/
void TM1629_Init(void)
{
    TM1629_IO_STB_H;
    TM1629_IO_CLK_H;
    TM1629_IO_DIO_H;
}

